package com.hejing.io流概述.处理流之对象流;

import org.junit.Test;

import java.io.*;

/**
 * ClassName: ObjectInputOutputStreamTest
 * Package: com.hejing.io流概述.处理流之对象流
 * Description:
 *
 * @Author: HeJing
 * @Create: 2023-06-02 14:51
 * @Version: 1.0
 */
public class ObjectInputOutputStreamTest {

    /**
     * 序列化过程: 使用ObjectOutputStream流实现。将内存中的Java对象保存在文件中或者通过网络传输出去。
     */
    @Test
    public void test01() {
        ObjectOutputStream oos = null;
        try {
            File file = new File("D:\\HeJing_Java\\io_test\\object.txt");
            oos = new ObjectOutputStream(new FileOutputStream(file));

            // 写出数据即为序列化的过程:
            // 序列化字符串:writeUTF()
            oos.writeUTF("江山如此多娇，引无数英雄竞折腰");
            oos.flush();

            // 序列化对象: writeObject()
            oos.writeObject("轻轻的我走了，正如我轻轻的来。");
            oos.flush();

            System.out.println("序列化成功...");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (oos != null)
                    oos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 反序列化过程: 使用ObjectInputStream 流实现，将文件中的数据或者网络传输过来的数据还原为内存中的Java对象。
     */
    @Test
    public void test02() {
        ObjectInputStream ois = null;
        try {
            // 1、
            File file = new File("D:\\HeJing_Java\\io_test\\object.txt");

            ois = new ObjectInputStream(new FileInputStream(file));

            // 2、读取文件中的对象，反序列化过程:
            String str1 = ois.readUTF();
            String str2 = String.valueOf(ois.readObject());
            System.out.println(str1);
            System.out.println(str2);
            System.out.println();
            System.out.println("反序列化成功...");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 演示自定义类对象的序列化过程。
     */
    @Test
    public void test03() {
        ObjectOutputStream oos = null;
        try {
            // 1、
            File file = new File("D:\\HeJing_Java\\io_test\\object.dat");

            oos = new ObjectOutputStream(new FileOutputStream(file));

            // 2、
            Person p1 = new Person("Tom", 21);
            oos.writeObject(p1);
            oos.flush();

            System.out.println("序列化完成...");

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                oos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 演示自定义类对象的反序列化过程。
     */
    @Test
    public void test04() {
        ObjectInputStream ois = null;
        try {
            // 1、
            File file = new File("D:\\HeJing_Java\\io_test\\object.dat");

            ois = new ObjectInputStream(new FileInputStream(file));

            // 2、读取文件中的对象，反序列化过程:
            Person p1 = (Person) ois.readObject();
            System.out.println(p1);

            System.out.println("反序列化完成...");

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}























